<?php
//团队积累
//单字幕函数 +----------------------------------------------------------------------
/**
 * 打印变量,断点
 * @param unknown $a 变量
 * @param string $b  是否打印变量类型
 */
function t($a, $b = false) {
    echo "<pre>";
    if ($b) {
        var_dump($a);
    } else {
        print_r($a);
    }
    exit("</pre>");
}

/**
 * 页面输出
 * @param string $msg 信息
 * @param string $exit 是否阻断
 */
function e($msg='', $exit = false){
    if($exit){
        exit("------------------{$msg}-------------------<br>");
    }else{
        echo("------------------{$msg}-------------------<br>");
    }
}

/**
 * 获取配置
 * @param string $name  配置一级键值的名称
 * @param string $key   配置二级键值的名称
 * @return \think\mixed
 */
function c($name = '', $key = ''){
    $rs = \think\Config::get($name);
    if( $key!=='' ){
        return isset($rs[$key]) ? $rs[$key] : "";
    }   
    return $rs;
}
/**
 * 获取sql
 */
function com_sql(){
    $sql = \think\Db::getLastSql();
    t($sql);
}
/**
 * 统计日志
 * @param unknown $data
 * @param string $name
 */
function com_log($data=[],$name='log'){
    $str="\r\n-----------------------------------------".date("Y-m-d H:i:s")."-----------------------------------------\r\n";
    foreach($data as $key=>$val)
    {
        $str.="$key:$val\r\n";
    }
    $dir = __DIR__."/../public/uploads/logs/".date("Ym")."/";
    com_mkdir($dir);
    $file = "$name".date("Ymd").".txt";
    file_put_contents($dir.$file, $str,FILE_APPEND);
}

/**
 * 给url添加参数
 * @param unknown $url
 * @param unknown $param
 */
function com_add_url($url, $param=[]){
    foreach($param as $k => $v){
        $url = preg_replace('/(&|\?)'.$k.'=[^&]+/', '', $url);
        if(!$v)
            continue;
        
        if(strpos($url,'?') === false){
            $url.= '?'.$k.'='.$v;
        } else {
            $url.= '&'.$k.'='.$v;
        }
    }
    return $url;
}

/**
 * URL重定向
 * @param string  $url   重定向的URL地址
 * @param integer $time  重定向的等待时间（秒）
 * @param string  $msg   重定向前的提示信息
 * @return 跳转页面
 */
function r($url, $time = 0, $msg = '') {
    if (empty($msg))
        $msg = "系统将在{$time}秒之后自动跳转到{$url}！";

    if (!headers_sent()) {
        if (0 === $time) {
            header('Location: ' . $url);
        } else {
            header("refresh:{$time};url={$url}");
            echo ($msg);
        }
    } else {
        $str = "<meta http-equiv='Refresh' content='{$time};URL={$url}'>";
        if ($time != 0) {
            $str .= $msg;
        }
        echo ($str);
    }
    exit;
}

//判断函数 +----------------------------------------------------------------------
function is_post(){
    return request()->isPost();
}



//通用函数 +----------------------------------------------------------------------

function com_send_sms(){
    
}

function com_get_filesize( $file ){
    $perms=stat($file);
    $size = $perms['size'];
    $a    = ['B', 'KB', 'MB', 'GB', 'TB'];
    $pos  = 0;
    while ($size >= 1024) {
        $size /= 1024;
        $pos++;
    }
    return round($size, 2). $a[$pos];
}
function com_get_filetime( $file ){
    return date("Y-m-d H:i:s", filemtime($file));
}


/**
 * 组装url
 * @param unknown $baseurl
 * @param unknown $param
 * @param string $urlencode
 */
function com_build_url($baseurl, $param, $urlencode=false)
{
    $str='';
    foreach($param as $key => $val)
    {
        if($urlencode){
            $key = urlencode($key);
            $val = urlencode($val);
        } 
        $str.="&$key=$val";
    }
    $str = ltrim($str,"&");
    return $baseurl.$str;
}



/**
 * 返回当前页页码
 * @param unknown $total     总条数
 * @param number  $page      页码
 * @param number  $page_size 每页显示条数
 * @return 页码
 */
function com_cur_page($total, $page = 1,  $page_size = 12){
    return \my\Page::curPage($total, $page, $page_size);
}   
/**
 * 返回分页数据
 * @param unknown $total 总条数
 * @param unknown $page  当前页码
 * @param unknown $page_size  每页显示条数
 * @return 分页原始数据
 */
function com_page_data( $total, $page = 1,  $page_size = 12 ){
    return \my\Page::getData($total,$page,$page_size);
}   
/**
 * 组建后端ajax的table列表
 * @param unknown $list    列表数据
 * @param unknown $arr     格式化列的key值
 * @return  列表 tbody html
 */
function com_build_table($list, $arr){
    return \my\Html::buildTable($list, $arr);
}
/**
 * 组件分页html
 * @param unknown $data 分页数据的原始数据
 * @return 分页html
 */
function com_build_page( $data = [] ){
    return \my\Html::buildPage($data);
}

function com_build_page2( $data = [] ){
        $temp = "";
        if( !empty($data) ){
            $data['total']          = $data['total'] ? $data['total'] : 0;
            $data['total_page_num'] = $data['total_page_num'] ? $data['total_page_num'] : 0;
        
            //首页
            if (isset($data['first']) && !empty($data['first'])) {
                $temp .= '<a href="javascript:void(0)" onclick="com_search(' . $data['first'] . ')">首页</a>';
            }
            //上一页
            if (isset($data['pre']) && !empty($data['pre'])) {
                $temp .= '<a class="pg-prev" href="javascript:void(0)" onclick="com_search(' . $data['pre'] . ')">上页</a>';
            }
            //数字目录
            foreach ($data['list'] as $val) {
                $is_cur = $val == $data['cur'] ? true : false;
                if($is_cur){
                    $temp .= '<span href="javascript:void(0)">&nbsp;'.$val.'&nbsp;</span>';
                }else{
                    $temp .= '<a onclick="com_search(' . $val . ')">&nbsp;'.$val.'&nbsp;</a>';
                }
            }
        
            //下一页
            if (isset($data['next']) && !empty($data['next'])) {
                $temp .= '<a href="javascript:void(0)" onclick="com_search(' . $data['next'] . ')">下页<em></em></a>';
            }
            //尾页
            if (isset($data['last']) && !empty($data['last'])) {
                $temp .= '<a href="javascript:void(0)" onclick="com_search(' . $data['last'] . ')">尾页</a>';
            }
            
        }
        return $temp;
}

/**
 * 重写TP5验证，封装到前端
 * @param unknown $rule 规则
 * @param unknown $msg  提示
 * @param unknown $data 数据
 * @param boolean $exit  是否输出到前端
 * @return boolean
 */
function com_validate( $rule, $msg, $data, $exit = false ){
    $v = new \think\Validate($rule, $msg);
    $v->batch();
    if( $v->check($data) )
        return true;
    //把错误捕捉到前端类里
    com_error( $v->getError() );
    //错误处理
    if($exit){
        $config = [
            'err' => ['return_type'=>'json'],
        ];
    }else{
        $config = [
            'err' => ['return_type'=>'return'],
        ];
    }
    return com_check($config);
}

/**
 * 密码
 * @param string $password
 */
function com_password($password = '123456'){
    $str = "abcdefghijklmnopqrstuvwxyz";
    return md5($password.$str);
}

/**
 * 上传单个图片//允许类型 'jpg', 'gif', 'png', 'jpeg','ico'
 * @param string $dir          目录
 * @param string $name          上传字段名称
 * @param string $is_thumb      是否生成缩略图
 * @param unknown $con_thumb    缩略图大小配置
 * @return 返回路径
 */
function com_up_pic( $dir='article', $name='pic', $is_thumb = true, $con_thumb = ['small'=>[100,100], 'middle'=>[300,300]] ){
    return \my\Up::upPic($dir,$name,$is_thumb,$con_thumb);
}

/**
 * 上传文件
 * @param string $dir  上传到目录
 * @param string $name  上传文件字段
 * @param unknown $exts 允许文件的后缀名
 * @return 返回路径
 */
function com_up_file($dir='rsa', $name='pic', $exts = []){
    return \my\Up::upFile($dir,$name, $exts);    
}

/**
 * 递归创建目录
 * @param unknown $dir  文件路径
 * @return true or false
 */
function com_mkdir( $dir ){
    if ( is_dir($dir) || @mkdir($dir) ) return true;
    if ( !com_mkdir(dirname($dir)) ) return false;
    return @mkdir($dir);
}
/**
 * 下载excle
 * @param unknown $data   内容
 * @param unknown $title  标题
 * @param unknown $field  内容的过滤字段
 * @param unknown $type  文件位置/文件名   
 * @return 返回文件的绝对路径
 */
function com_csv( $data, $title=[], $field=[], $type ){
    $content = "";
    //标题
    foreach($title as $val){
        $content .= $val.",";
    }
    $content = rtrim($content, ",")."\r\n";
    //内容
    foreach( $data as $val ){
        foreach($field as $f){
            $content .= str_replace(array(","),array(""),$val[$f]).",";
        }
        $content = rtrim($content, ",")."\r\n";
    }
    $dir = c('uploads')."csv/".date("Y-m")."/".date("d");
    com_mkdir( $dir );
    $filename = $dir."/".$type."_".time().".csv";
    file_put_contents($filename, $content);
    return "http://".$_SERVER['HTTP_HOST']."/".$filename;
}
/**
 * 截取utf8字符串,完美支持中文
 * @param: 待截取的字符串,从第几个字符开始截取，截取长度，如超过长度是否加“..”
 * @param string $str 截取的字符串
 * @param int   $len  截取长度
 * @param int   $from 从那个位置开始截取
 * @param string $adddot  截取后用什么填充 默认...
 */
function com_substr($str, $len, $adddot = '...', $from = 0) {
    if ($adddot && mb_strlen($str, 'utf-8') > intval($len)) {
        return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,' . $from . '}' . '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,' . $len . '}).*#s', '$1', $str) . $adddot;
    } else {
        return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,' . $from . '}' . '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,' . $len . '}).*#s', '$1', $str);
    }
}


/**
 * 返回ip地址或IPV4数字
 * @param number $type 0返回ip， 1返回数字
 * @return ip地址
 */
function com_client_ip( $type = 0 ){
    $type       =  $type ? 1 : 0;
    static $ip  =   NULL;
    if ($ip !== NULL) return $ip[$type];
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $arr    =   explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $pos    =   array_search('unknown',$arr);
        if(false !== $pos) unset($arr[$pos]);
        $ip     =   trim($arr[0]);
    }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
        $ip     =   $_SERVER['HTTP_CLIENT_IP'];
    }elseif (isset($_SERVER['REMOTE_ADDR'])) {
        $ip     =   $_SERVER['REMOTE_ADDR'];
    }
    // IP地址合法验证
    $long = ip2long($ip);
    $ip   = $long ? array($ip, $long) : array('0.0.0.0', 0);
    return $ip[$type];
}
/**
 * 返回服务器ip
 */
function com_server_ip(){
    return gethostbyname($_SERVER["SERVER_NAME"]);
}

/**
 * 产生token值
 * @param string $user_id  用户id, 或者其他
 */
function com_token( $user_id = '' ){
    $str = time().rand(100,999).$user_id;
    return md5($str);
}
/**
 * 生成订单号
 * @return  string
 */
function com_order_no()
{
    $id = db('temp_id')->insertGetId(['t'=>1]);
    return date('YmdHi').(1000000+$id);
}
/**
 * 取得图片绝对路径
 * @param string $path   图片相对路径
 * @param string $type   图片类型  small/middle
 * @param string $check   是否返回404图片
 * @return 返回图片绝对路径
 */
function com_get_pic($path = '', $type = '', $check = false ){
    if(empty($path)) return '';
    $domain =   "http://{$_SERVER['HTTP_HOST']}/";

    $file = $path;
    if( in_array($type, array('small', 'middle')) )
        $file = dirname($path) . "/" . $type . "_" . basename($path);

    if( $check && !is_file(PUBLIC_PATH.$file) ){
        $file = "./static/com/404.png";
    }
    return $domain.$file;
}

/**
 * 捕捉错误
 * @param unknown $error_data  错误数据
 * @param number $code         错误码
 */
function com_error( $error_data = [], $code = 100 ){
    return \my\Front::error($error_data, $code);
}

/**
 * 验证错误，并处理前端交互
 * @param unknown $config  返回前端参数
 * @param string $is_api   是否是api
 * @return 返回 bool or exit json
 */
function com_check($config = [], $is_api = false ){
    return \my\Front::check($config, $is_api);
}
/**
 * 获取模块名称
 */
function com_module(){
    $request = \think\Request::instance();
    return strtolower($request->module());
}
/**
 * 获取控制器名称
 */
function com_controller(){
    $request = \think\Request::instance();
    return strtolower($request->controller());
}
/**
 * 获取动作名称
 */
function com_action(){
    $request = \think\Request::instance();
    return strtolower($request->action());   
}
/**
 * 取得后台登陆用户信息
 * @param string $field 字段名称， 可取单个字段值
 */
function com_admininfo( $field = '' ){
    return \my\G::get('admininfo', $field);
}
/**
 * 取得前台登陆用户信息
 * @param string $field 字段
 */
function com_userinfo( $field = '' ){
    return \my\G::get('userinfo', $field);
}


/*============*/
/**
 * 格式化显示时间
 * @param unknown $time 时间
 * @param string $format 格式
 * @return string
 */
function com_format_time($time, $format="Y-m-d H:i"){
    return $time ? date($format, $time) : "";
}
/**
 * 格式化多选删除选项框
  * @param unknown $id 主键id值
  * @return string
  */
function com_format_checkbox( $id ){
    return "<input type='checkbox' name='id[]' tid='{$id}'>";
}
/**
 * 格式化qq显示
 * @param string $qq  qq号
 * @param string $islink  是否快捷联系QQ    
 * @return string
 */
function com_format_qq( $qq='', $islink=true){
    if($qq){
        return  $islink ? "<a target='_blank' href='tencent://message/?uin={$qq}&amp;Site=qq&amp;Menu=yes'>{$qq}</a>" : $qq;
    }else{
        return "";
    }   
}

/**
 * 格式化图片html
 * @param unknown $path  图片路径
 * @param number $height 高度
 * @param string $width  宽度
 */
function com_format_pic($path, $height=50, $width='auto'){
    return $path ? "<img src='{$path}' height={$height} style='width:{$width};' />" : "";    
}

/**
 * 格式化状态html
 * 0表示关，    1表示开
 * @param string $path
 * @param number $id
 */
function com_format_status($path='',$id=0,$status=0)
{
    return '
      <div class="switch" status="'.$status.'" data-on-label="开" data-off-label="关">
         <input type="checkbox"  '.($status?'checked':'').' _url='.$path.' tid="'.$id.'" onchange="com_status(this)" />
      </div>
    ';
}
//0表示开，   1表示关
function com_format_status2($path='',$id=0,$status=0)
{
    return '
      <div class="switch" status="'.$status.'" data-on-label="开" data-off-label="关">
         <input type="checkbox"  '.($status?'':'checked').' _url='.$path.' tid="'.$id.'" onchange="com_status(this)" />
      </div>
    ';
}



/**
 * 格式化状态下拉, 带ajax修改值
 * @param unknown $val    状态值
 * @param unknown $lists  状态列表值
 * @param unknown $url    ajax修改值得链接地址
 * @param unknown $id     主键id
 * @param string $width   列表宽度
 * @return string
 */
function com_format_select_edit($val, $lists, $url, $id, $width = "auto"){
    if( !$lists )
        return "";

    $html     =   "<select style='width:{$width};' _url='{$url}' tid='{$id}' onchange='com_edit(this)'>";
    foreach($lists as $k => $v){
        $selected = $k==$val ? "selected=true" : "";
        $html    .=   "<option value='{$k}' ".$selected.">{$v}</option>";
    }
    $html .= "</select>";
    return $html;
}
/**
 * 编辑框 带ajax更新
 * @param unknown $url 编辑的url
 * @param unknown $id  主键id
 * @param unknown $val 原来的值
 * @param string $width 宽度
 */
function com_format_input_edit($url, $id, $val, $width = "50px"){
   return "<input style='width:50px;' type='text' _url='{$url}' check='number' tid='{$id}' old='{$val}' value='{$val}' onchange='com_edit(this)' />";
}





/**
 * 编辑按钮
 * @param unknown $url  编辑页面的url
 * @param unknown $id   主键id
 * @param string $msg   页面显示标题
 * @param string $title 按钮标题
 * @return string
 */
function com_action_edit($url, $id, $msg='编辑文章', $title='编辑', $icons="&#xe6df;"){
    return "<a class='ml-5' tid='{$id}' _url='{$url}' msg='{$msg}' onclick='com_page(this)' href='javascript:;' title='{$title}'><i class='Hui-iconfont'>{$icons}</i></a>";
}
/**
 * 拷贝按钮
 * @param unknown $url  拷贝按钮的url
 * @param unknown $id   主键id
 * @param string $msg   提示文字
 * @param string $title 按钮标题
 * @return string
 */
function com_action_copy($url, $id, $msg='你确定要拷贝吗?', $title='拷贝', $icons="&#xe645;"){
    return "<a class='ml-5' tid='{$id}' _url='{$url}' msg='{$msg}' onclick='com_confirm(this)' href='javascript:;' title='{$title}'><i class='Hui-iconfont'>{$icons}</i></a>";
}
/**
 * 查看按钮
 * @param unknown $url  查看按钮的url
 * @param unknown $id   主键id
 * @param string $msg   网页显示文字
 * @param string $title 按钮标题
 * @return string
 */
function com_action_views($url, $id, $msg='查看文章', $title='查看', $icons="&#xe725;"){
    return "<a class='ml-5' tid='{$id}' _url='{$url}' msg='{$msg}' onclick='com_page(this)' href='javascript:;' title='{$title}'><i class='Hui-iconfont'>{$icons}</i></a>";
}
/**
 * 删除按钮
 * @param unknown $url  编辑按钮的url
 * @param unknown $id   主键id
 * @param string $msg   新页面显示标题
 * @param string $title 按钮标题
 * @return string
 */
function com_action_del($url, $id, $msg='你确定要删除吗?', $title='删除', $icons="&#xe6e2;"){
    return "<a class='ml-5' tid='{$id}' _url='{$url}' msg='{$msg}' onclick='com_confirm(this)' href='javascript:;' title='{$title}'><i class='Hui-iconfont'>{$icons}</i></a>";
}




/**
 * 确认按钮
 * @param unknown $url  确认按钮的url
 * @param unknown $id   主键id
 * @param string $msg   新页面显示标题
 * @param string $title 按钮标题
 * @return string
 */
function com_action_confirm($url, $id, $msg='你确定要吗?', $title='确认', $icons="&#xe6e0;", $check_url=""){
    $temp = [
        'del'   => '&#xe6e2;',
        'views' => '&#xe725;',
        'copy'  => '&#xe645;',
        'edit'  => '&#xe6df;',
        'active'=> '&#xe615;',
    ];
    $icons = isset($temp[$icons]) ? $temp[$icons] : $icons; 
    if($check_url)
        $check_url = "check_url='{$check_url}'";
    return "<a class='ml-5' tid='{$id}' _url='{$url}' msg='{$msg}' {$check_url} onclick='com_confirm(this)' href='javascript:;' title='{$title}'><i class='Hui-iconfont'>{$icons}</i></a>";
}